<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        function Parent(name) {
            this.name = name || '父亲' // 实例基本属性（该属性，强调私有，不共享）
            this.arr = [1] // 
        }
        Parent.prototype.say = function() { // 将需要复用、共享的方法写在父类原型上
            console.log('hello');
        }

        function Child(like) {
            this.like = like
        }
        Child.prototype = new Parent() // 核心，但此时，Child.prototype.constructor == Parent
        Child.prototype.constructor = Child // 修正constructor 指向

        let boy1 = new Child()
        let boy2 = new Child()

        // 优点： 共享了父类构造函数的say方法
        console.log(boy1.say(), boy2.say(), boy1.say === boy2.say); // hello hello true
        // 缺点1：不能向父类构造函数传参
        console.log(boy1.name, boy2.name, boy1.name === boy2.name); // 父亲 父亲 true
        // 缺点2: 子类实例共享了父类构造函数的引用属性，比如arr属性
        boy1.arr.push(2)
            // 修改了boy1的arr属性，boy2的arr属性，也会变化，因为两个实例的原型上（Child.prototype）有了父类构造函数的实例属性arr
            // 所以只要修改了boy1.arr,boy2.arr的属性也会变化
        console.log(boy2.arr); // [1,2]

        // 注意1：修改boy1的name属性，是不会影响到boy2.name,因为设置boy1.name 相当于在子类实例新增了name属性
        // 注意2：
        console.log(boy1.constructor); // Parent 你会发现实例的构造函数居然是Parent
        //
        new Parent('李四')
    </script>
</body>

</html>